/* eslint-disable no-redeclare */
/* eslint-disable no-extend-native */
function typeStr(obj) {
  // '' => '[object String]'
  // 1 => '[object Number]'
  // [] => [object Array]'
  // {} => [object Object]'
  // null => [object Null]'
  // undefined => [object Undefined]'
  // new Function => [object Function]'
  return Object.prototype.toString.call(obj)
}

function findX() {
  if (arguments.length === 2) {
    var obj = arguments[0]
    var conditions = arguments[1]
  } else if (arguments.length === 1) {
    var obj = this
    var conditions = arguments[0]
  }

  for (let condition of conditions) {
    if (obj === undefined) {
      return
    }
    if (typeStr(obj) === '[object Array]') {
      // 内容是列表
      if (typeStr(condition) === '[object Object]') {
        // 条件是 obj
        let key = Object.keys(condition)[0]
        let value = condition[key]
        obj = obj.find((i) => {
          return i[key] === value
        })
      } else if (typeStr(condition) === '[object Number]') {
        // 条件是 数字
        obj = obj[condition]
      } else {
        throw new Error('条件错误')
      }
    } else if (typeStr(obj) === '[object Object]' &&
      typeStr(condition) === '[object String]') {
      obj = obj[condition]
    } else {
      throw new Error('条件错误')
    }
  }
  return obj
}

Object.defineProperty(Object.prototype, 'findX', {
  enumerable: false, // 设置为不可枚举，不会出现在 for in 或者 Object.keys() 循环中
  // configurable: false, // 是否配置，以及可否删除 整个属性
  // writable: false, // 是否可以改变 value 的值
  value: findX
})
